/**
 * 障碍物渲染器
 * 专门负责地图中障碍物的渲染和碰撞检测
 */

class ObstacleRenderer {
    constructor() {
        this.obstacles = [];
        this.initialized = false;
    }

    /**
     * 初始化障碍物渲染器
     * @param {CanvasRenderingContext2D} ctx - 画布上下文
     * @param {Object} gameConfig - 游戏配置
     */
    initialize(ctx, gameConfig) {
        this.ctx = ctx;
        this.gameConfig = gameConfig;
        this.initialized = true;
        console.log('障碍物渲染器初始化完成');
    }

    /**
     * 设置障碍物数据
     * @param {Array} obstacles - 障碍物数组
     */
    setObstacles(obstacles) {
        this.obstacles = obstacles || [];
        console.log(`障碍物渲染器: 设置 ${this.obstacles.length} 个障碍物`);
        
        // 打印前10个障碍物位置用于调试
        if (this.obstacles.length > 0) {
            console.log('障碍物位置示例:', this.obstacles.slice(0, 10));
        }
    }

    /**
     * 渲染障碍物
     * @param {CanvasRenderingContext2D} ctx - 画布上下文
     * @param {number} scaleX - X轴缩放比例
     * @param {number} scaleY - Y轴缩放比例
     * @param {Object} camera - 摄像机偏移（可选）
     */
    render(ctx, scaleX, scaleY, camera = { x: 0, y: 0 }) {
        console.log('障碍物渲染器render方法被调用');
        console.log('渲染器状态:', {
            initialized: this.initialized,
            obstacleCount: this.obstacles.length,
            scaleX: scaleX,
            scaleY: scaleY,
            camera: camera
        });
        
        if (!this.initialized) {
            console.error('障碍物渲染器未初始化！');
            return;
        }
        
        if (this.obstacles.length === 0) {
            console.log('没有障碍物需要渲染');
            return;
        }

        // 设置障碍物样式
        ctx.fillStyle = '#808080'; // 灰色
        ctx.strokeStyle = '#606060'; // 深灰色边框
        ctx.lineWidth = 1;

        // 渲染每个障碍物
        this.obstacles.forEach((obstacle, index) => {
            // 计算障碍物在屏幕上的位置（考虑摄像机偏移）
            const x = obstacle.x * scaleX - camera.x;
            const y = obstacle.y * scaleY - camera.y;
            
            console.log(`渲染障碍物 ${index}: x=${obstacle.x}, y=${obstacle.y}, 屏幕位置: x=${x}, y=${y}`);
            
            // 检查障碍物是否在可视区域内
            if (this.isInViewport(x, y, scaleX, this.gameConfig.viewportSize)) {
                // 绘制障碍物主体（使用完整的网格大小）
                ctx.fillRect(x, y, scaleX, scaleY);
                
                // 绘制障碍物边框
                ctx.strokeRect(x, y, scaleX, scaleY);
                
                // 添加纹理效果
                this.addTexture(ctx, x, y, scaleX);
            }
        });

        console.log(`障碍物渲染器: 渲染了 ${this.obstacles.length} 个障碍物`);
    }

    /**
     * 检查障碍物是否在可视区域内
     */
    isInViewport(x, y, size, viewportSize) {
        // 放宽可视区域检查，允许部分超出屏幕的障碍物也被渲染
        // 这样可以确保所有障碍物都能正确显示，特别是当摄像机移动时
        return x + size >= -size && x <= viewportSize + size && 
               y + size >= -size && y <= viewportSize + size;
    }

    /**
     * 添加障碍物纹理效果
     */
    addTexture(ctx, x, y, size) {
        // 添加简单的纹理效果
        ctx.fillStyle = 'rgba(255, 255, 255, 0.2)';
        ctx.fillRect(x + 1, y + 1, size - 2, size - 2);
    }

    /**
     * 检查位置是否有障碍物
     * @param {number} x - X坐标
     * @param {number} y - Y坐标
     * @returns {boolean} 是否有障碍物
     */
    hasObstacle(x, y) {
        return this.obstacles.some(obs => obs.x === x && obs.y === y);
    }

    /**
     * 清除所有障碍物
     */
    clear() {
        this.obstacles = [];
        console.log('障碍物渲染器: 已清除所有障碍物');
    }

    /**
     * 获取障碍物数量
     */
    getObstacleCount() {
        return this.obstacles.length;
    }
}

// 创建全局障碍物渲染器实例
window.obstacleRenderer = new ObstacleRenderer();

console.log('障碍物渲染器模块加载完成');